package com.zenithmind.version.mapper.base;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.version.pojo.domain.Repository;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 仓库查询Mapper接口 - 遵循接口隔离原则，专门处理仓库查询操作
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Mapper
public interface RepositoryQueryMapper {

    /**
     * 分页查询仓库列表
     * 
     * @param page 分页参数
     * @param ownerId 所有者ID
     * @param type 仓库类型
     * @param status 仓库状态
     * @param keyword 关键词
     * @return 仓库列表
     */
    IPage<Repository> selectRepositoryPage(Page<Repository> page,
                                          @Param("ownerId") String ownerId,
                                          @Param("type") Integer type,
                                          @Param("status") Integer status,
                                          @Param("keyword") String keyword);

    /**
     * 查询用户的仓库列表
     * 
     * @param userId 用户ID
     * @param type 仓库类型
     * @return 仓库列表
     */
    List<Repository> selectUserRepositories(@Param("userId") String userId,
                                           @Param("type") Integer type);

    /**
     * 查询公开仓库列表
     * 
     * @param keyword 关键词
     * @param language 编程语言
     * @param limit 限制数量
     * @return 仓库列表
     */
    List<Repository> selectPublicRepositories(@Param("keyword") String keyword,
                                             @Param("language") String language,
                                             @Param("limit") Integer limit);

    /**
     * 根据名称和所有者查询仓库
     * 
     * @param name 仓库名称
     * @param ownerId 所有者ID
     * @return 仓库
     */
    Repository selectByNameAndOwner(@Param("name") String name,
                                   @Param("ownerId") String ownerId);

    /**
     * 搜索仓库
     * 
     * @param keyword 关键词
     * @param type 仓库类型
     * @param language 编程语言
     * @param limit 限制数量
     * @return 仓库列表
     */
    List<Repository> searchRepositories(@Param("keyword") String keyword,
                                       @Param("type") Integer type,
                                       @Param("language") String language,
                                       @Param("limit") Integer limit);

    /**
     * 检查仓库名称是否存在
     * 
     * @param name 仓库名称
     * @param ownerId 所有者ID
     * @param excludeId 排除的仓库ID
     * @return 是否存在
     */
    boolean existsByNameAndOwner(@Param("name") String name,
                                @Param("ownerId") String ownerId,
                                @Param("excludeId") String excludeId);
}
